import axios from 'axios'
import {ElMessage} from 'element-plus'
import router from '@/router'
import config from '@/config'

/**
 * 创建axios实例
 */
const request = axios.create({
    baseURL: config.api.baseURL,
    timeout: config.api.timeout,
    headers: {
        'Content-Type': 'application/json'
    }
})

/**
 * 请求拦截器
 */
request.interceptors.request.use(
    (requestConfig) => {
        // 添加token到请求头
        const token = localStorage.getItem(config.auth.tokenKey)
        if (token) {
            requestConfig.headers.Authorization = `Bearer ${token}`
        }

        if (config.dev.debug) {
            console.log('发送请求:', requestConfig.method?.toUpperCase(), requestConfig.url, requestConfig.data)
        }
        return requestConfig
    },
    (error) => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

/**
 * 响应拦截器
 */
request.interceptors.response.use(
    (response) => {
        if (config.dev.debug) {
            console.log('响应数据:', response.data)
        }

        const {code, message} = response.data

        // 请求成功
        if (code === 200) {
            return response.data
        }

        // 业务错误
        ElMessage({
            type: 'error',
            message: message || '请求失败',
            duration: config.message.duration,
            showClose: config.message.showClose
        })
        return Promise.reject(new Error(message || '请求失败'))
    },
    (error) => {
        console.error('响应错误:', error)

        // 处理HTTP错误状态码
        if (error.response) {
            const {status, data} = error.response

            switch (status) {
                case 401:
                    ElMessage({
                        type: 'error',
                        message: '登录已过期，请重新登录',
                        duration: config.message.duration
                    })
                    // 清除token并跳转到登录页
                    localStorage.removeItem(config.auth.tokenKey)
                    // 只有在非登录页面时才跳转
                    if (router.currentRoute.value.path !== config.auth.loginPath) {
                        router.push(config.auth.loginPath)
                    }
                    break
                case 403:
                    ElMessage.error('没有权限访问')
                    break
                case 404:
                    ElMessage.error('请求的资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                default:
                    ElMessage.error(data?.message || '网络错误')
            }
        } else if (error.request) {
            ElMessage.error('网络连接失败，请检查网络')
        } else {
            ElMessage.error('请求配置错误')
        }

        return Promise.reject(error)
    }
)

export default request